/*
 *  Author: zhaijl 
 *  Url: http://218.1.73.212/down.php
 *  Country: China
 *  
 * ====================================================================
 *
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 * ====================================================================
 *
 * This software based apache mina 2.0 and spring 3.0
 *
 */
package org.cloudy.common.find;

import java.lang.InstantiationException;
import java.lang.IllegalAccessException;
import java.lang.LinkageError;
import java.lang.Exception;
import java.lang.ClassNotFoundException;

public class Finder {
	private static abstract class ClassLoaderFoundation {
		abstract ClassLoader getContentClassLoader () ;
	}

	static class ClassLoderFoundationImpl extends ClassLoaderFoundation {
		ClassLoader getContentClassLoader () {
			return Thread.currentThread ().getContextClassLoader () ;
		}
	}

	private static ClassLoader getClassLoader () throws Exception {
		Class<?> cla = null ;
		ClassLoader classLoader = null ;
		ClassLoaderFoundation cf = null ;
		try {
			cla = Class.forName ( new StringBuffer ( Finder.class.getName () ).
				append ( "$ClassLoderFoundationChild" ).toString () 
			) ;
			cf = (ClassLoaderFoundation) cla.newInstance () ;
			classLoader = cf.getContentClassLoader () ;
		} catch ( LinkageError le ) {
			classLoader = Finder.class.getClassLoader () ;
		} catch ( ClassNotFoundException ce ) {
			classLoader = Finder.class.getClassLoader () ;
		} catch ( InstantiationException ie ) {
			throw ie ;
		} catch ( IllegalAccessException ie ) {
			throw ie ;
		}

		return classLoader ;
	}

	private static Object newInstance ( String classname, ClassLoader classloader )
			throws Exception {
		Class<?> cla = null ;
		try {
			if ( classloader == null )
				cla = Class.forName ( classname ) ;
			else
				cla = classloader.loadClass ( classname ) ;

			return cla.newInstance();
		} catch ( ClassNotFoundException cnfe ) {
			throw cnfe ;
		} catch ( IllegalAccessException iae ) {
			throw iae ;
		} catch ( InstantiationException ie ) {
			throw ie ;
		}
	}

	public static Object findClass ( String classid ) throws Exception {
		ClassLoader classLoader = getClassLoader () ;
		return newInstance ( classid, classLoader ) ;
	}
}
